import pandas as pd
import numpy as np
import seaborn as sns
4: 서울 종합병원 분포 확인하기
부스트코스
공공데이터 상권정보 분석해보기
필요한 라이브러리 불러오기
시각화를 위한 폰트 설정
# ctrl(cmd) + / : 주석처리를 풀었다 했다
import matplotlib.pyplot as plt
# window의 한글 폰트 설정
'font',family='Malgun Gothic') #윈도우의 경우
plt.rc(
# plt.rc('font', family='AppleGothic') #맥의 경우
'axes', unicode_minus=False) #마이너스 폰트 깨지는 것 대비
plt.rc(
# 그래프가 노트북 안에 보이게 하기 위해
%matplotlib inline
from IPython.display import set_matplotlib_formats
#폰트가 선명하게 보이기 위해
%config InlineBackend.figure_format = 'retina'
데이터 로드하기
!move "C:\Users\user\Downloads\소상공인시장진흥공단_상가업소정보_의료기관_201909.csv"
지정된 파일을 찾을 수 없습니다.
= pd.read_csv("data/소상공인시장진흥공단_상가업소정보_의료기관_201909.csv", low_memory=False)
df # low_memory=False로 설정이 되어야 한다. 안그럼 오류남.
# 데이터의 행과 열 크기를 찍어볼 수 있따 df.shape
(91335, 39)
데이터 미리보기
- head, tail을 통해 데이터를 미리 볼수 있따
# shift + tab 키를 누르면 docstring을 볼 수 있다
# head: 데이터 미리보기
1) df.head(
상가업소번호 | 상호명 | 지점명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 표준산업분류코드 | ... | 건물관리번호 | 건물명 | 도로명주소 | 구우편번호 | 신우편번호 | 동정보 | 층정보 | 호정보 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 19956873 | 하나산부인과 | NaN | S | 의료 | S01 | 병원 | S01B10 | 산부인과 | Q86201 | ... | 4127310900110810000010857 | 산호한양아파트 | 경기도 안산시 단원구 달미로 10 | 425764.0 | 15236.0 | NaN | NaN | NaN | 126.814295 | 37.336344 |
1 rows × 39 columns
# tail: 마지막 데이터 불러오기
1) df.tail(
상가업소번호 | 상호명 | 지점명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 표준산업분류코드 | ... | 건물관리번호 | 건물명 | 도로명주소 | 구우편번호 | 신우편번호 | 동정보 | 층정보 | 호정보 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
91334 | 16109073 | 천안김안과천안역본점의원 | NaN | S | 의료 | S01 | 병원 | S01B13 | 안과의원 | Q86201 | ... | 4413110700102660017016314 | 김안과 | 충청남도 천안시 동남구 중앙로 92 | 330952.0 | 31127.0 | NaN | NaN | NaN | 127.152651 | 36.80664 |
1 rows × 39 columns
데이터 요약하기
요약정보
# 요약정보가 나타난다
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 91335 entries, 0 to 91334
Data columns (total 39 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 상가업소번호 91335 non-null int64
1 상호명 91335 non-null object
2 지점명 1346 non-null object
3 상권업종대분류코드 91335 non-null object
4 상권업종대분류명 91335 non-null object
5 상권업종중분류코드 91335 non-null object
6 상권업종중분류명 91335 non-null object
7 상권업종소분류코드 91335 non-null object
8 상권업종소분류명 91335 non-null object
9 표준산업분류코드 86413 non-null object
10 표준산업분류명 86413 non-null object
11 시도코드 90956 non-null float64
12 시도명 90956 non-null object
13 시군구코드 90956 non-null float64
14 시군구명 90956 non-null object
15 행정동코드 91335 non-null int64
16 행정동명 90956 non-null object
17 법정동코드 91280 non-null float64
18 법정동명 91280 non-null object
19 지번코드 91335 non-null int64
20 대지구분코드 91335 non-null int64
21 대지구분명 91335 non-null object
22 지번본번지 91335 non-null int64
23 지번부번지 72079 non-null float64
24 지번주소 91335 non-null object
25 도로명코드 91335 non-null int64
26 도로명 91335 non-null object
27 건물본번지 91335 non-null int64
28 건물부번지 10604 non-null float64
29 건물관리번호 91335 non-null object
30 건물명 46453 non-null object
31 도로명주소 91335 non-null object
32 구우편번호 91323 non-null float64
33 신우편번호 91333 non-null float64
34 동정보 7406 non-null object
35 층정보 44044 non-null object
36 호정보 15551 non-null object
37 경도 91335 non-null float64
38 위도 91335 non-null float64
dtypes: float64(9), int64(7), object(23)
memory usage: 27.2+ MB
# object : 문자열로 된 데이터 타입
# int: 정수형
# float : 실수형
컬럼명보기
# 컬럼명만 추출해보기
df.columns
Index(['상가업소번호', '상호명', '지점명', '상권업종대분류코드', '상권업종대분류명', '상권업종중분류코드',
'상권업종중분류명', '상권업종소분류코드', '상권업종소분류명', '표준산업분류코드', '표준산업분류명', '시도코드',
'시도명', '시군구코드', '시군구명', '행정동코드', '행정동명', '법정동코드', '법정동명', '지번코드',
'대지구분코드', '대지구분명', '지번본번지', '지번부번지', '지번주소', '도로명코드', '도로명', '건물본번지',
'건물부번지', '건물관리번호', '건물명', '도로명주소', '구우편번호', '신우편번호', '동정보', '층정보',
'호정보', '경도', '위도'],
dtype='object')
데이터 타입
# 데이터 타입만 출력
df.dtypes
상가업소번호 int64
상호명 object
지점명 object
상권업종대분류코드 object
상권업종대분류명 object
상권업종중분류코드 object
상권업종중분류명 object
상권업종소분류코드 object
상권업종소분류명 object
표준산업분류코드 object
표준산업분류명 object
시도코드 float64
시도명 object
시군구코드 float64
시군구명 object
행정동코드 int64
행정동명 object
법정동코드 float64
법정동명 object
지번코드 int64
대지구분코드 int64
대지구분명 object
지번본번지 int64
지번부번지 float64
지번주소 object
도로명코드 int64
도로명 object
건물본번지 int64
건물부번지 float64
건물관리번호 object
건물명 object
도로명주소 object
구우편번호 float64
신우편번호 float64
동정보 object
층정보 object
호정보 object
경도 float64
위도 float64
dtype: object
결측치
df.isnull()# true로 표시되는 값은 null 값!
상가업소번호 | 상호명 | 지점명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 표준산업분류코드 | ... | 건물관리번호 | 건물명 | 도로명주소 | 구우편번호 | 신우편번호 | 동정보 | 층정보 | 호정보 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | False | False | True | False | False | False | False | False | False | False | ... | False | False | False | False | False | True | True | True | False | False |
1 | False | False | True | False | False | False | False | False | False | False | ... | False | True | False | False | False | True | False | True | False | False |
2 | False | False | True | False | False | False | False | False | False | False | ... | False | False | False | False | False | True | True | True | False | False |
3 | False | False | True | False | False | False | False | False | False | True | ... | False | True | False | False | False | True | False | True | False | False |
4 | False | False | False | False | False | False | False | False | False | False | ... | False | True | False | False | False | True | False | True | False | False |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
91330 | False | False | False | False | False | False | False | False | False | False | ... | False | True | False | False | False | True | True | True | False | False |
91331 | False | False | False | False | False | False | False | False | False | False | ... | False | False | False | False | False | True | True | True | False | False |
91332 | False | False | True | False | False | False | False | False | False | False | ... | False | False | False | False | False | True | False | True | False | False |
91333 | False | False | True | False | False | False | False | False | False | False | ... | False | True | False | False | False | True | True | True | False | False |
91334 | False | False | True | False | False | False | False | False | False | False | ... | False | False | False | False | False | True | True | True | False | False |
91335 rows × 39 columns
= df.isnull().sum()
null_count null_count
상가업소번호 0
상호명 0
지점명 89989
상권업종대분류코드 0
상권업종대분류명 0
상권업종중분류코드 0
상권업종중분류명 0
상권업종소분류코드 0
상권업종소분류명 0
표준산업분류코드 4922
표준산업분류명 4922
시도코드 379
시도명 379
시군구코드 379
시군구명 379
행정동코드 0
행정동명 379
법정동코드 55
법정동명 55
지번코드 0
대지구분코드 0
대지구분명 0
지번본번지 0
지번부번지 19256
지번주소 0
도로명코드 0
도로명 0
건물본번지 0
건물부번지 80731
건물관리번호 0
건물명 44882
도로명주소 0
구우편번호 12
신우편번호 2
동정보 83929
층정보 47291
호정보 75784
경도 0
위도 0
dtype: int64
# 결측치를 막대그래프로 표현
# 선그래프로 표시되는데.. 적합하지 않은 거 같아! null_count.plot()
=60)
null_count.plot.bar(rot# rot = 글자 돌려보는것
null_count.plot.barh()
=(5,7)) # 그래프 사이즈 지정 null_count.plot.barh(figsize
# 위에서 계산한 결측치 수를 reset_index 통해 데이터 프레임으로 만들기
# df_null_coount 변수에 결과를 담아 head로 미리보기 해보기
= null_count.reset_index()
df_null_count df_null_count.head()
index | 0 | |
---|---|---|
0 | 상가업소번호 | 0 |
1 | 상호명 | 0 |
2 | 지점명 | 89989 |
3 | 상권업종대분류코드 | 0 |
4 | 상권업종대분류명 | 0 |
컬럼명 변경하기
# 변수에 담겨있는 컬럼이름 변경
= ["컬럼명", "결측치수"]
df_null_count.columns df_null_count.head()
컬럼명 | 결측치수 | |
---|---|---|
0 | 상가업소번호 | 0 |
1 | 상호명 | 0 |
2 | 지점명 | 89989 |
3 | 상권업종대분류코드 | 0 |
4 | 상권업종대분류명 | 0 |
정렬하기
# sort_values 통해 정렬
# 결측치가 많은 순으로 상위 10개 출력
= df_null_count.sort_values(by="결측치수", ascending=False).head(10)
df_null_count_top df_null_count_top
컬럼명 | 결측치수 | |
---|---|---|
2 | 지점명 | 89989 |
34 | 동정보 | 83929 |
28 | 건물부번지 | 80731 |
36 | 호정보 | 75784 |
35 | 층정보 | 47291 |
30 | 건물명 | 44882 |
23 | 지번부번지 | 19256 |
9 | 표준산업분류코드 | 4922 |
10 | 표준산업분류명 | 4922 |
11 | 시도코드 | 379 |
특정 컬럼만 불러오기
# 지점명 컬럼 불러오기
# NaN == Not a Number의 약자로 결측치를 의미한다.
"지점명"].head() df[
0 NaN
1 NaN
2 NaN
3 NaN
4 수지점
Name: 지점명, dtype: object
# "컬럼명" 이라는 컬럼 값만 가져와서 drop_columns 라는 변수에 담기
= df_null_count_top["컬럼명"].tolist() # tolist : list로 만들어줌
drop_columns drop_columns
['지점명',
'동정보',
'건물부번지',
'호정보',
'층정보',
'건물명',
'지번부번지',
'표준산업분류코드',
'표준산업분류명',
'시도코드']
# drop_columns 변수로 해당 컬럼 정보만 데이터프레임에서 가져오기
df[drop_columns].head()
지점명 | 동정보 | 건물부번지 | 호정보 | 층정보 | 건물명 | 지번부번지 | 표준산업분류코드 | 표준산업분류명 | 시도코드 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | NaN | NaN | NaN | NaN | NaN | 산호한양아파트 | NaN | Q86201 | 일반 의원 | 41.0 |
1 | NaN | NaN | NaN | NaN | 4 | NaN | 14.0 | Q86201 | 일반 의원 | 11.0 |
2 | NaN | NaN | NaN | NaN | NaN | 한라프라자 | 1.0 | Q86201 | 일반 의원 | 41.0 |
3 | NaN | NaN | NaN | NaN | 5 | NaN | 1.0 | NaN | NaN | 26.0 |
4 | 수지점 | NaN | NaN | NaN | 1 | NaN | 2.0 | G47811 | 의약품 및 의료용품 소매업 | 41.0 |
제거하기
print(df.shape)
= df.drop(drop_columns, axis=1)
df # axis=1 컬럼기준으로 drop axis > 행(0), 열 (1)
print(df.shape)
(91335, 39)
(91335, 29)
# 제거 결과 info로 확인
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 91335 entries, 0 to 91334
Data columns (total 29 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 상가업소번호 91335 non-null int64
1 상호명 91335 non-null object
2 상권업종대분류코드 91335 non-null object
3 상권업종대분류명 91335 non-null object
4 상권업종중분류코드 91335 non-null object
5 상권업종중분류명 91335 non-null object
6 상권업종소분류코드 91335 non-null object
7 상권업종소분류명 91335 non-null object
8 시도명 90956 non-null object
9 시군구코드 90956 non-null float64
10 시군구명 90956 non-null object
11 행정동코드 91335 non-null int64
12 행정동명 90956 non-null object
13 법정동코드 91280 non-null float64
14 법정동명 91280 non-null object
15 지번코드 91335 non-null int64
16 대지구분코드 91335 non-null int64
17 대지구분명 91335 non-null object
18 지번본번지 91335 non-null int64
19 지번주소 91335 non-null object
20 도로명코드 91335 non-null int64
21 도로명 91335 non-null object
22 건물본번지 91335 non-null int64
23 건물관리번호 91335 non-null object
24 도로명주소 91335 non-null object
25 구우편번호 91323 non-null float64
26 신우편번호 91333 non-null float64
27 경도 91335 non-null float64
28 위도 91335 non-null float64
dtypes: float64(6), int64(7), object(16)
memory usage: 20.2+ MB
기초 통계값 보기
기초 통계 수치
df.dtypes
상가업소번호 int64
상호명 object
상권업종대분류코드 object
상권업종대분류명 object
상권업종중분류코드 object
상권업종중분류명 object
상권업종소분류코드 object
상권업종소분류명 object
시도명 object
시군구코드 float64
시군구명 object
행정동코드 int64
행정동명 object
법정동코드 float64
법정동명 object
지번코드 int64
대지구분코드 int64
대지구분명 object
지번본번지 int64
지번주소 object
도로명코드 int64
도로명 object
건물본번지 int64
건물관리번호 object
도로명주소 object
구우편번호 float64
신우편번호 float64
경도 float64
위도 float64
dtype: object
#평균값
"위도"].mean() df[
36.62471119236673
# 중앙값
"위도"].median() df[
37.2346523177033
# 최댓값
"위도"].max() df[
38.4996585705598
# 최솟값
"위도"].min() df[
33.2192896688307
# 갯수
"위도"].count() df[
91335
기초통계값 요약하기 - describe
데이터를 요약해서 볼 수 있음
# 위도를 descibe로 요약
"위도"].describe() df[
count 91335.000000
mean 36.624711
std 1.041361
min 33.219290
25% 35.811830
50% 37.234652
75% 37.507463
max 38.499659
Name: 위도, dtype: float64
# 2개의 컬럼을 describe로 요약
"위도", "경도"]
df[
# pandas에서는 리스트 형태로 가져와야한다. 위와 같이 하면 오류남
KeyError: ('위도', '경도')
"위도", "경도"]] df[[
위도 | 경도 | |
---|---|---|
0 | 37.336344 | 126.814295 |
1 | 37.488742 | 127.053198 |
2 | 37.344955 | 126.734841 |
3 | 35.166872 | 129.115438 |
4 | 37.323528 | 127.095522 |
... | ... | ... |
91330 | 36.352728 | 127.389865 |
91331 | 37.627530 | 126.830144 |
91332 | 35.227138 | 129.082790 |
91333 | 37.540993 | 127.143958 |
91334 | 36.806640 | 127.152651 |
91335 rows × 2 columns
"위도", "경도"]].describe() df[[
위도 | 경도 | |
---|---|---|
count | 91335.000000 | 91335.000000 |
mean | 36.624711 | 127.487524 |
std | 1.041361 | 0.842877 |
min | 33.219290 | 124.717632 |
25% | 35.811830 | 126.914297 |
50% | 37.234652 | 127.084550 |
75% | 37.507463 | 128.108919 |
max | 38.499659 | 130.909912 |
# describe로 문자열 데이터타입 요약
# 기본값은 수치형으로 되어있음! df.describe()
상가업소번호 | 시군구코드 | 행정동코드 | 법정동코드 | 지번코드 | 대지구분코드 | 지번본번지 | 도로명코드 | 건물본번지 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 9.133500e+04 | 90956.000000 | 9.133500e+04 | 9.128000e+04 | 9.133500e+04 | 91335.000000 | 91335.000000 | 9.133500e+04 | 91335.000000 | 91323.000000 | 91333.00000 | 91335.000000 | 91335.000000 |
mean | 2.121818e+07 | 32898.381877 | 3.293232e+09 | 3.293385e+09 | 3.293191e+18 | 1.001336 | 587.534549 | 3.293207e+11 | 251.200482 | 428432.911085 | 28085.47698 | 127.487524 | 36.624711 |
std | 5.042828e+06 | 12985.393171 | 1.297387e+09 | 1.297706e+09 | 1.297393e+18 | 0.036524 | 582.519364 | 1.297391e+11 | 477.456487 | 193292.339066 | 18909.01455 | 0.842877 | 1.041361 |
min | 2.901108e+06 | 11110.000000 | 1.111052e+09 | 1.111010e+09 | 1.111010e+18 | 1.000000 | 1.000000 | 1.111020e+11 | 0.000000 | 100011.000000 | 1000.00000 | 124.717632 | 33.219290 |
25% | 2.001931e+07 | 26350.000000 | 2.635065e+09 | 2.635011e+09 | 2.635011e+18 | 1.000000 | 162.000000 | 2.635042e+11 | 29.000000 | 302120.000000 | 11681.00000 | 126.914297 | 35.811830 |
50% | 2.211900e+07 | 41117.000000 | 4.111758e+09 | 4.111710e+09 | 4.111711e+18 | 1.000000 | 462.000000 | 4.111743e+11 | 92.000000 | 440300.000000 | 24353.00000 | 127.084550 | 37.234652 |
75% | 2.480984e+07 | 43113.000000 | 4.311370e+09 | 4.311311e+09 | 4.311311e+18 | 1.000000 | 858.000000 | 4.311332e+11 | 257.000000 | 602811.000000 | 46044.00000 | 128.108919 | 37.507463 |
max | 2.852470e+07 | 50130.000000 | 5.013061e+09 | 5.013032e+09 | 5.013061e+18 | 2.000000 | 7338.000000 | 5.013049e+11 | 8795.000000 | 799801.000000 | 63643.00000 | 130.909912 | 38.499659 |
="object")
df.describe(include
# top : 가장 많이 나타난걸 보여줌
# freq : frequency : 빈도수.. 리원이라는 상호명이 152번 등장한다.
# 결측치는 제외하고 보여줌!
상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구명 | 행정동명 | 법정동명 | 대지구분명 | 지번주소 | 도로명 | 건물관리번호 | 도로명주소 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 91335 | 91335 | 91335 | 91335 | 91335 | 91335 | 91335 | 90956 | 90956 | 90956 | 91280 | 91335 | 91335 | 91335 | 91335 | 91335 |
unique | 56910 | 1 | 1 | 5 | 5 | 34 | 34 | 17 | 228 | 2791 | 2822 | 2 | 53118 | 16610 | 54142 | 54031 |
top | 리원 | S | 의료 | S01 | 병원 | S02A01 | 약국 | 경기도 | 서구 | 중앙동 | 중동 | 대지 | 서울특별시 동대문구 제기동 965-1 | 서울특별시 강남구 강남대로 | 1123010300109650001031604 | 서울특별시 동대문구 약령중앙로8길 10 |
freq | 152 | 91335 | 91335 | 60774 | 60774 | 18964 | 18964 | 21374 | 3165 | 1856 | 874 | 91213 | 198 | 326 | 198 | 198 |
# 모든 데이터 요약
="all") df.describe(include
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구코드 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 9.133500e+04 | 91335 | 91335 | 91335 | 91335 | 91335 | 91335 | 91335 | 90956 | 90956.000000 | ... | 91335 | 9.133500e+04 | 91335 | 91335.000000 | 91335 | 91335 | 91323.000000 | 91333.00000 | 91335.000000 | 91335.000000 |
unique | NaN | 56910 | 1 | 1 | 5 | 5 | 34 | 34 | 17 | NaN | ... | 53118 | NaN | 16610 | NaN | 54142 | 54031 | NaN | NaN | NaN | NaN |
top | NaN | 리원 | S | 의료 | S01 | 병원 | S02A01 | 약국 | 경기도 | NaN | ... | 서울특별시 동대문구 제기동 965-1 | NaN | 서울특별시 강남구 강남대로 | NaN | 1123010300109650001031604 | 서울특별시 동대문구 약령중앙로8길 10 | NaN | NaN | NaN | NaN |
freq | NaN | 152 | 91335 | 91335 | 60774 | 60774 | 18964 | 18964 | 21374 | NaN | ... | 198 | NaN | 326 | NaN | 198 | 198 | NaN | NaN | NaN | NaN |
mean | 2.121818e+07 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 32898.381877 | ... | NaN | 3.293207e+11 | NaN | 251.200482 | NaN | NaN | 428432.911085 | 28085.47698 | 127.487524 | 36.624711 |
std | 5.042828e+06 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 12985.393171 | ... | NaN | 1.297391e+11 | NaN | 477.456487 | NaN | NaN | 193292.339066 | 18909.01455 | 0.842877 | 1.041361 |
min | 2.901108e+06 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 11110.000000 | ... | NaN | 1.111020e+11 | NaN | 0.000000 | NaN | NaN | 100011.000000 | 1000.00000 | 124.717632 | 33.219290 |
25% | 2.001931e+07 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 26350.000000 | ... | NaN | 2.635042e+11 | NaN | 29.000000 | NaN | NaN | 302120.000000 | 11681.00000 | 126.914297 | 35.811830 |
50% | 2.211900e+07 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 41117.000000 | ... | NaN | 4.111743e+11 | NaN | 92.000000 | NaN | NaN | 440300.000000 | 24353.00000 | 127.084550 | 37.234652 |
75% | 2.480984e+07 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 43113.000000 | ... | NaN | 4.311332e+11 | NaN | 257.000000 | NaN | NaN | 602811.000000 | 46044.00000 | 128.108919 | 37.507463 |
max | 2.852470e+07 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | 50130.000000 | ... | NaN | 5.013049e+11 | NaN | 8795.000000 | NaN | NaN | 799801.000000 | 63643.00000 | 130.909912 | 38.499659 |
11 rows × 29 columns
중복제거한 값 보기
- unique로 중복 제거 nuique 갯수 세기
# 상권업종대분류명
"상권업종대분류명"].unique() df[
array(['의료'], dtype=object)
"상권업종대분류명"].nunique() df[
1
# 상권업종중분류명
"상권업종중분류명"].unique() df[
array(['병원', '약국/한약방', '수의업', '유사의료업', '의료관련서비스업'], dtype=object)
"상권업종중분류명"].nunique() df[
5
# 상권업종소분류명
"상권업종소분류명"].unique() df[
array(['산부인과', '내과/외과', '신경외과', '기타병원', '약국', '동물병원', '한약방', '탕제원',
'정형/성형외과', '소아과', '이비인후과의원', '노인/치매병원', '언어치료', '수의업-종합', '한의원',
'치과의원', '침구원', '일반병원', '안과의원', '조산원', '한방병원', '종합병원', '유사의료업기타',
'응급구조대', '혈액원', '치과병원', '척추교정치료', '피부과', '비뇨기과', '치과기공소', '산후조리원',
'접골원', '수의업-기타', '제대혈'], dtype=object)
"상권업종소분류명"].nunique() df[
34
len(df["상권업종소분류명"].unique())
34
그룹화된 요약값 보기 - value_counts
- 카테고리 형태의 데이터 갯수를 셀 수 있다.
# 시도코드 세어보기 -> 결측치...
"시도명"].head() df[
0 경기도
1 서울특별시
2 경기도
3 부산광역시
4 경기도
Name: 시도명, dtype: object
# 시도명 세보면
= df["시도명"].value_counts()
city city
경기도 21374
서울특별시 18943
부산광역시 6473
경상남도 4973
인천광역시 4722
대구광역시 4597
경상북도 4141
전라북도 3894
충청남도 3578
전라남도 3224
광주광역시 3214
대전광역시 3067
충청북도 2677
강원도 2634
울산광역시 1997
제주특별자치도 1095
세종특별자치시 353
Name: 시도명, dtype: int64
# normalize=True 옵션 사용시 비율을 구할 수 있다.
= df["시도명"].value_counts(normalize=True)
city_normalize city_normalize
경기도 0.234993
서울특별시 0.208266
부산광역시 0.071166
경상남도 0.054675
인천광역시 0.051915
대구광역시 0.050541
경상북도 0.045528
전라북도 0.042812
충청남도 0.039338
전라남도 0.035446
광주광역시 0.035336
대전광역시 0.033720
충청북도 0.029432
강원도 0.028959
울산광역시 0.021956
제주특별자치도 0.012039
세종특별자치시 0.003881
Name: 시도명, dtype: float64
city.plot()
# 막대그래프 표현
city.plot.barh()
# plto.pie() 사용하여 파이그래프 그리기
=(7,7)) city_normalize.plot.pie(figsize
# seaborn의 countplot 그리기
=df, y="시도명" ) sns.countplot(data
=sns.countplot(data=df, y="시도명" )
c# 변수명에 담아주면 밑에 글씨가 없어진당
"상권업종대분류명"].value_counts() df[
의료 91335
Name: 상권업종대분류명, dtype: int64
= df["상권업종중분류명"].value_counts()
d d
병원 60774
약국/한약방 20923
수의업 5323
유사의료업 3774
의료관련서비스업 541
Name: 상권업종중분류명, dtype: int64
=df["상권업종중분류명"].value_counts(normalize=True)
n n
병원 0.665397
약국/한약방 0.229080
수의업 0.058280
유사의료업 0.041320
의료관련서비스업 0.005923
Name: 상권업종중분류명, dtype: float64
d.plot()
d.plot.bar()
=0) # x축 레이블 값 회전 d.plot.bar(rot
n.plot.pie()
= df["상권업종소분류명"].value_counts()
c c
약국 18964
치과의원 13731
한의원 13211
내과/외과 11374
기타병원 4922
일반병원 3385
동물병원 3098
정형/성형외과 2562
소아과 2472
수의업-종합 2216
치과기공소 1724
이비인후과의원 1486
한약방 1442
피부과 1273
산부인과 1116
노인/치매병원 1055
안과의원 1042
비뇨기과 809
종합병원 762
치과병원 756
언어치료 664
유사의료업기타 629
탕제원 517
산후조리원 511
신경외과 421
한방병원 397
척추교정치료 338
침구원 154
혈액원 130
응급구조대 125
조산원 30
접골원 9
수의업-기타 9
제대혈 1
Name: 상권업종소분류명, dtype: int64
=(7, 8), grid= True) #gird: 격자 표시 c.plot.barh(figsize
데이터 색인하기
# 상권업종분류명이 약국/한약방인 데이터만 가져와서
# df_medical이라는 변수에 담고
# head()통해 미리보기
= df[df["상권업종중분류명"] == "약국/한약방"].copy()
df_medical 1) df_medical.head(
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구코드 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
4 | 20364049 | 더블유스토어수지점 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | 경기도 | 41465.0 | ... | 경기도 용인시 수지구 풍덕천동 712-2 | 414653205024 | 경기도 용인시 수지구 문정로 | 32 | 4146510100107120002026238 | 경기도 용인시 수지구 문정로 32 | 448170.0 | 16837.0 | 127.095522 | 37.323528 |
1 rows × 29 columns
# 상권업종대분류명이 의료만 가져오기
# df.loc 사용하면 행, 열을 함께 가져온다.
# 이 기능을 통해 상권업종중뷴려망만 가져온다
# 가져온 결과를 value_counts를 통해 중분류의 갯수를 세본다.
"상권업종대분류명"] == "의료", "상권업종중분류명"].value_counts() df.loc[df[
병원 60774
약국/한약방 20923
수의업 5323
유사의료업 3774
의료관련서비스업 541
Name: 상권업종중분류명, dtype: int64
# 위와 같은 기능을 수행하는 코드
# df.loc[df["상권업종대분류명"] == "의료"]["상권업종중분류명"] 근데 이건 느리다!!
= df["상권업종대분류명"] == "의료"
m "상권업종중분류명"].value_counts() df.loc[m,
병원 60774
약국/한약방 20923
수의업 5323
유사의료업 3774
의료관련서비스업 541
Name: 상권업종중분류명, dtype: int64
# 유사의료업
"상권업종중분류명"] == "유사의료업"] df[df[
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구코드 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
22 | 21013731 | 세종언어치료센터 | S | 의료 | S03 | 유사의료업 | S03B07 | 언어치료 | 부산광역시 | 26410.0 | ... | 부산광역시 금정구 구서동 84-1 | 264102000010 | 부산광역시 금정구 중앙대로 | 1817 | 2641010700100840001017686 | 부산광역시 금정구 중앙대로 1817-11 | 609310.0 | 46273.0 | 129.091662 | 35.246528 |
40 | 20933900 | 고려수지침학회 | S | 의료 | S03 | 유사의료업 | S03B03 | 침구원 | 경상남도 | 48123.0 | ... | 경상남도 창원시 성산구 상남동 5-2 | 481234784088 | 경상남도 창원시 성산구 마디미로4번길 | 9 | 4812312700100050002026799 | 경상남도 창원시 성산구 마디미로4번길 9 | 642832.0 | 51495.0 | 128.684678 | 35.224113 |
97 | 21717820 | 청명원 | S | 의료 | S03 | 유사의료업 | S03B09 | 유사의료업기타 | 충청북도 | 43760.0 | ... | 충청북도 괴산군 청안면 금신리 241 | 437604538132 | 충청북도 괴산군 청안면 금신로1길 | 93 | 4376037022102410000007293 | 충청북도 괴산군 청안면 금신로1길 93 | 367831.0 | 28050.0 | 127.635740 | 36.768935 |
102 | 21865854 | 응급환자이송센터 | S | 의료 | S03 | 유사의료업 | S03B01 | 응급구조대 | 대전광역시 | 30140.0 | ... | 대전광역시 중구 대사동 248-237 | 301404295026 | 대전광역시 중구 계룡로921번길 | 40 | 3014011000102480237013097 | 대전광역시 중구 계룡로921번길 40 | 301846.0 | 34946.0 | 127.417693 | 36.321801 |
108 | 21914637 | 태화아동발달지원센터 | S | 의료 | S03 | 유사의료업 | S03B07 | 언어치료 | 대전광역시 | 30140.0 | ... | 대전광역시 중구 문화동 27 | 301404295402 | 대전광역시 중구 보문산로333번길 | 29 | 3014011600100270000008172 | 대전광역시 중구 보문산로333번길 29 | 301130.0 | 35020.0 | 127.412725 | 36.312953 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
91300 | 16131218 | 으뜸치과기공소 | S | 의료 | S03 | 유사의료업 | S03B06 | 치과기공소 | 경상남도 | 48170.0 | ... | 경상남도 진주시 수정동 39-11 | 481704797625 | 경상남도 진주시 향교로18번길 | 8 | 4817011600100390011004490 | 경상남도 진주시 향교로18번길 8 | 660180.0 | 52753.0 | 128.084600 | 35.197029 |
91310 | 16199325 | 보령치과기공소 | S | 의료 | S03 | 유사의료업 | S03B06 | 치과기공소 | 서울특별시 | 11290.0 | ... | 서울특별시 성북구 동소문동4가 103-11 | 112903107003 | 서울특별시 성북구 동소문로 | 47 | 1129010700101030014050661 | 서울특별시 성북구 동소문로 47-15 | 136821.0 | 2832.0 | 127.010602 | 37.591455 |
91311 | 16199088 | 점프셈교실 | S | 의료 | S03 | 유사의료업 | S03B09 | 유사의료업기타 | 경상북도 | 47130.0 | ... | 경상북도 경주시 황성동 446 | 471304715895 | 경상북도 경주시 용담로104번길 | 16 | 4713012400104460000024894 | 경상북도 경주시 용담로104번길 16 | 780954.0 | 38084.0 | 129.211755 | 35.865600 |
91319 | 16108560 | 씨앤디자인치과기공소 | S | 의료 | S03 | 유사의료업 | S03B06 | 치과기공소 | 서울특별시 | 11545.0 | ... | 서울특별시 금천구 가산동 60-25 | 115453116013 | 서울특별시 금천구 벚꽃로 | 234 | 1154510100100600025000001 | 서울특별시 금천구 벚꽃로 234 | 153798.0 | 8513.0 | 126.886122 | 37.475986 |
91327 | 16190388 | 오피스알파 | S | 의료 | S03 | 유사의료업 | S03B06 | 치과기공소 | 경기도 | 41173.0 | ... | 경기도 안양시 동안구 호계동 970-24 | 411734349013 | 경기도 안양시 동안구 경수대로507번길 | 28 | 4117310400109700024005182 | 경기도 안양시 동안구 경수대로507번길 28 | 431849.0 | 14120.0 | 126.956365 | 37.367779 |
3774 rows × 29 columns
"상권업종중분류명"] == "유사의료업"].shape df[df[
(3774, 29)
# 상호명 그룹화해서 갯수
# value_counts를 사용해 상위 10개 출력
"상호명"].value_counts().head(10) df[
리원 152
온누리약국 149
경희한의원 141
우리약국 119
중앙약국 111
전자담배 98
조은약국 95
건강약국 87
제일약국 79
사랑약국 73
Name: 상호명, dtype: int64
"상호명"].value_counts().tail() df[
메리디언치과 1
이엘피부과성형외과 1
금오중국한의원 1
오케이연합의원 1
천안김안과천안역본점의원 1
Name: 상호명, dtype: int64
= df[df["상권업종중분류명"] == "유사의료업"]
df_medi df_medi
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구코드 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
22 | 21013731 | 세종언어치료센터 | S | 의료 | S03 | 유사의료업 | S03B07 | 언어치료 | 부산광역시 | 26410.0 | ... | 부산광역시 금정구 구서동 84-1 | 264102000010 | 부산광역시 금정구 중앙대로 | 1817 | 2641010700100840001017686 | 부산광역시 금정구 중앙대로 1817-11 | 609310.0 | 46273.0 | 129.091662 | 35.246528 |
40 | 20933900 | 고려수지침학회 | S | 의료 | S03 | 유사의료업 | S03B03 | 침구원 | 경상남도 | 48123.0 | ... | 경상남도 창원시 성산구 상남동 5-2 | 481234784088 | 경상남도 창원시 성산구 마디미로4번길 | 9 | 4812312700100050002026799 | 경상남도 창원시 성산구 마디미로4번길 9 | 642832.0 | 51495.0 | 128.684678 | 35.224113 |
97 | 21717820 | 청명원 | S | 의료 | S03 | 유사의료업 | S03B09 | 유사의료업기타 | 충청북도 | 43760.0 | ... | 충청북도 괴산군 청안면 금신리 241 | 437604538132 | 충청북도 괴산군 청안면 금신로1길 | 93 | 4376037022102410000007293 | 충청북도 괴산군 청안면 금신로1길 93 | 367831.0 | 28050.0 | 127.635740 | 36.768935 |
102 | 21865854 | 응급환자이송센터 | S | 의료 | S03 | 유사의료업 | S03B01 | 응급구조대 | 대전광역시 | 30140.0 | ... | 대전광역시 중구 대사동 248-237 | 301404295026 | 대전광역시 중구 계룡로921번길 | 40 | 3014011000102480237013097 | 대전광역시 중구 계룡로921번길 40 | 301846.0 | 34946.0 | 127.417693 | 36.321801 |
108 | 21914637 | 태화아동발달지원센터 | S | 의료 | S03 | 유사의료업 | S03B07 | 언어치료 | 대전광역시 | 30140.0 | ... | 대전광역시 중구 문화동 27 | 301404295402 | 대전광역시 중구 보문산로333번길 | 29 | 3014011600100270000008172 | 대전광역시 중구 보문산로333번길 29 | 301130.0 | 35020.0 | 127.412725 | 36.312953 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
91300 | 16131218 | 으뜸치과기공소 | S | 의료 | S03 | 유사의료업 | S03B06 | 치과기공소 | 경상남도 | 48170.0 | ... | 경상남도 진주시 수정동 39-11 | 481704797625 | 경상남도 진주시 향교로18번길 | 8 | 4817011600100390011004490 | 경상남도 진주시 향교로18번길 8 | 660180.0 | 52753.0 | 128.084600 | 35.197029 |
91310 | 16199325 | 보령치과기공소 | S | 의료 | S03 | 유사의료업 | S03B06 | 치과기공소 | 서울특별시 | 11290.0 | ... | 서울특별시 성북구 동소문동4가 103-11 | 112903107003 | 서울특별시 성북구 동소문로 | 47 | 1129010700101030014050661 | 서울특별시 성북구 동소문로 47-15 | 136821.0 | 2832.0 | 127.010602 | 37.591455 |
91311 | 16199088 | 점프셈교실 | S | 의료 | S03 | 유사의료업 | S03B09 | 유사의료업기타 | 경상북도 | 47130.0 | ... | 경상북도 경주시 황성동 446 | 471304715895 | 경상북도 경주시 용담로104번길 | 16 | 4713012400104460000024894 | 경상북도 경주시 용담로104번길 16 | 780954.0 | 38084.0 | 129.211755 | 35.865600 |
91319 | 16108560 | 씨앤디자인치과기공소 | S | 의료 | S03 | 유사의료업 | S03B06 | 치과기공소 | 서울특별시 | 11545.0 | ... | 서울특별시 금천구 가산동 60-25 | 115453116013 | 서울특별시 금천구 벚꽃로 | 234 | 1154510100100600025000001 | 서울특별시 금천구 벚꽃로 234 | 153798.0 | 8513.0 | 126.886122 | 37.475986 |
91327 | 16190388 | 오피스알파 | S | 의료 | S03 | 유사의료업 | S03B06 | 치과기공소 | 경기도 | 41173.0 | ... | 경기도 안양시 동안구 호계동 970-24 | 411734349013 | 경기도 안양시 동안구 경수대로507번길 | 28 | 4117310400109700024005182 | 경기도 안양시 동안구 경수대로507번길 28 | 431849.0 | 14120.0 | 126.956365 | 37.367779 |
3774 rows × 29 columns
"상호명"].value_counts().head(10) df_medi[
리원 32
고려수지침 22
대한적십자사 17
헌혈의집 12
고려수지침학회 10
수치과기공소 10
제일치과기공소 9
미소치과기공소 8
아트치과기공소 8
이사랑치과기공소 8
Name: 상호명, dtype: int64
여러 조건으로 색인하기
# 상권업종소분류명이 약국이고 시도명이 서울특별시인 데이터
"상권업종소분류명"] == "약국" and df["시도명"] == "서울특별시"
df[# 오류! 판다스에서는 & 써야함.
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
"상권업종소분류명"] == "약국" & df["시도명"] == "서울특별시"
df[# 오류! 연산자 우선순위 때문에 오류가 났다.
TypeError: Cannot perform 'rand_' with a dtyped [object] array and scalar of type [bool]
= df[(df["상권업종소분류명"] == "약국") & (df["시도명"] == "서울특별시")]
df_seoul_drug print(df_seoul_drug.shape)
1) df_seoul_drug.head(
(3579, 29)
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구코드 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
33 | 20816709 | 이즈타워약 | S | 의료 | S02 | 약국/한약방 | S02A01 | 약국 | 서울특별시 | 11680.0 | ... | 서울특별시 강남구 역삼동 821 | 116803122010 | 서울특별시 강남구 테헤란로 | 101 | 1168010100108210001000001 | 서울특별시 강남구 테헤란로 101 | 135080.0 | 6134.0 | 127.028023 | 37.498656 |
1 rows × 29 columns
구별로 보기
# 시군구명으로 그룹화해서 갯수 세어보기
# 구별로 약국이 몇개가 있는지 확인
= df_seoul_drug["시군구명"].value_counts()
c c.head()
강남구 374
동대문구 261
광진구 212
서초구 191
송파구 188
Name: 시군구명, dtype: int64
= df_seoul_drug["시군구명"].value_counts(normalize=True)
n n.head()
강남구 0.104498
동대문구 0.072925
광진구 0.059234
서초구 0.053367
송파구 0.052529
Name: 시군구명, dtype: float64
=60) #rot:글씨를 기울인다 c.plot.bar(rot
# 상권업종소분류명이 종합병원
# 시도명이 서울특별시인 데이터
= df[(df["상권업종소분류명"] == "종합병원") & (df["시도명"] == "서울특별시")].copy()
df_seoul_hospital # copy를 해줘야 df_soeul_hospital 이 바뀐다. df까지 바뀌지 않는다.
df_seoul_hospital
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구코드 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
305 | 25155642 | 대진의료재단 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11215.0 | ... | 서울특별시 광진구 중곡동 58-25 | 112153104006 | 서울특별시 광진구 긴고랑로 | 119 | 1121510100100580025000733 | 서울특별시 광진구 긴고랑로 119 | 143220.0 | 4944.0 | 127.088279 | 37.559048 |
353 | 20471487 | 홍익병원별관 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11470.0 | ... | 서울특별시 양천구 신정동 897-13 | 114702005008 | 서울특별시 양천구 국회대로 | 250 | 1147010100108970013001044 | 서울특별시 양천구 국회대로 250 | 158070.0 | 7937.0 | 126.862805 | 37.529213 |
385 | 20737057 | SNUH | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11680.0 | ... | 서울특별시 강남구 역삼동 736-55 | 116804166727 | 서울특별시 강남구 테헤란로26길 | 10 | 1168010100107360055027688 | 서울특별시 강남구 테헤란로26길 10 | 135080.0 | 6236.0 | 127.035825 | 37.499630 |
1917 | 23210677 | 평화드림여의도성모병원의료기매장 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11560.0 | ... | 서울특별시 영등포구 여의도동 62 | 115603118001 | 서울특별시 영등포구 63로 | 10 | 1156011000100620000031477 | 서울특별시 영등포구 63로 10 | 150713.0 | 7345.0 | 126.936693 | 37.518296 |
2461 | 20024045 | 한양 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11200.0 | ... | 서울특별시 성동구 행당동 15-1 | 112003103002 | 서울특별시 성동구 마조로 | 22 | 1120010700100150001019623 | 서울특별시 성동구 마조로 22-2 | 133070.0 | 4763.0 | 127.041325 | 37.559469 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
71991 | 28505952 | 서울성모병원응급의료센터 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11650.0 | ... | 서울특별시 서초구 반포동 505 | 116502121003 | 서울특별시 서초구 반포대로 | 222 | 1165010700101230000017226 | 서울특별시 서초구 반포대로 222 | 137701.0 | 6591.0 | 127.005841 | 37.502382 |
76508 | 12292992 | 라마르의원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11740.0 | ... | 서울특별시 강동구 천호동 453-8 | 117404172367 | 서울특별시 강동구 천호대로157길 | 18 | 1174010900104530021010314 | 서울특별시 강동구 천호대로157길 18 | 134864.0 | 5335.0 | 127.127466 | 37.538485 |
90492 | 16031909 | 가톨릭대학교여의도성모병원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11140.0 | ... | 서울특별시 중구 명동2가 1-1 | 111404103165 | 서울특별시 중구 명동길 | 74 | 1114012700100010001019574 | 서울특별시 중구 명동길 74 | 100809.0 | 4537.0 | 126.986758 | 37.563662 |
90581 | 16332576 | 씨엠병원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11560.0 | ... | 서울특별시 영등포구 영등포동4가 90 | 115604154717 | 서울특별시 영등포구 영등포로36길 | 13 | 1156010500100900000035097 | 서울특별시 영등포구 영등포로36길 13 | 150030.0 | 7301.0 | 126.903857 | 37.518807 |
90788 | 16162338 | 성베드로병원 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11680.0 | ... | 서울특별시 강남구 도곡동 910-27 | 116802000003 | 서울특별시 강남구 남부순환로 | 2649 | 1168011800109100027000895 | 서울특별시 강남구 남부순환로 2649 | 135859.0 | 6271.0 | 127.039567 | 37.485604 |
91 rows × 29 columns
"시군구명"].value_counts() df_seoul_hospital[
강남구 15
영등포구 8
광진구 6
서초구 6
강동구 5
중구 5
송파구 5
강북구 4
도봉구 4
서대문구 4
양천구 4
성북구 3
강서구 2
중랑구 2
종로구 2
동대문구 2
구로구 2
노원구 2
금천구 2
성동구 2
관악구 2
동작구 1
마포구 1
용산구 1
은평구 1
Name: 시군구명, dtype: int64
텍스트 데이터 색인하기
# 색인 전 상호명 중에 종합병원이 아닌 데이터 찾기
~df_seoul_hospital["상호명"].str.contains("종합병원"),"상호명"].unique()
df_seoul_hospital.loc[
# str.contains하면 특정 값만 찾을 수 있다.
# 앞에 물결 표시를 하게 되면 종합병원이 안들어간 것만 찾을 수 있다.
array(['대진의료재단', '홍익병원별관', 'SNUH', '평화드림여의도성모병원의료기매장', '한양', '백산의료재단친구병원',
'서울보훈병원', '서울성모병원장례식장꽃배달', '서울대학교병원', '알콜중독및정신질환상담소',
'강남성모병원장례식장꽃배달', '제일병원', '이랜드클리닉', '사랑나눔의료재단', '우울증센터', '성심의료재단',
'다나의료재단', '서울아산병원신관', '원자력병원장례식장', '국민의원', '고려대학교구로병원', '학교법인일송학원',
'삼성의료원장례식장', '희명스포츠의학센터인공신장실', '연세대학교의과대학강남세브란스', '국립정신병원',
'코아클리닉', '수서제일의원', '사랑의의원', '한국전력공사부속한일병원', '신촌연세병원', '창동제일의원',
'영동세브란스병원', '제일성심의원', '삼성의료재단강북삼성태', '서울시립보라매병원', '서울이의원',
'서울대학교병원비상계획외래', '평화드림서울성모병원의료', '홍익병원', '사랑나눔의료재단서', '독일의원',
'서울연합의원', '우신향병원', '동부제일병원', '아산재단금강병원', '명곡안연구소', '아산재단서울중앙병원',
'메디힐특수여객', '삼성생명공익재단삼성서', '성광의료재단차병원', '한국건강관리협회서울특',
'정해복지부설한신메디피아', '성베드로병원', '성애의료재단', '실로암의원', 'Y&T성모마취과', '광진성모의원',
'서울현대의원', '이노신경과의원', '송정훼밀리의원', '서울중앙의원', '영남의료재단', '인제대학교서울백병원',
'한국필의료재단', '세브란스의원', '가톨릭대학교성바오로병원장례식장', '서울연세의원', '사랑의병원',
'성삼의료재단미즈메디병원', '씨엠충무병원', '성신의원', '원진재단부설녹색병원', '송파제일의원',
'카톨릭성모의원', '한양성심의원', '관악성모의원', '강남센트럴병원', '우이한솔의원', '우리들병원',
'서울성모병원어린이집', '건국대학교병원', '서울적십자병원', '북부성모의원', '한림대학교부속한강성심병원장례식장',
'서울성모병원응급의료센터', '라마르의원', '가톨릭대학교여의도성모병원', '씨엠병원'], dtype=object)
"상호명"].str.contains("꽃배달")] df_seoul_hospital[df_seoul_hospital[
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구코드 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2803 | 20895655 | 서울성모병원장례식장꽃배달 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11650.0 | ... | 서울특별시 서초구 반포동 551 | 116504163330 | 서울특별시 서초구 사평대로28길 | 55 | 1165010700105510000017194 | 서울특별시 서초구 사평대로28길 55 | 137040.0 | 6578.0 | 127.000682 | 37.498257 |
4644 | 22020310 | 강남성모병원장례식장꽃배달 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11650.0 | ... | 서울특별시 서초구 반포동 547-6 | 116504163242 | 서울특별시 서초구 반포대로39길 | 56 | 1165010700105470006016762 | 서울특별시 서초구 반포대로39길 56-24 | 137040.0 | 6578.0 | 127.001756 | 37.499095 |
2 rows × 29 columns
"상호명"].str.contains("의료기")] df_seoul_hospital[df_seoul_hospital[
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구코드 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1917 | 23210677 | 평화드림여의도성모병원의료기매장 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11560.0 | ... | 서울특별시 영등포구 여의도동 62 | 115603118001 | 서울특별시 영등포구 63로 | 10 | 1156011000100620000031477 | 서울특별시 영등포구 63로 10 | 150713.0 | 7345.0 | 126.936693 | 37.518296 |
1 rows × 29 columns
"상호명"].str.contains("꽃배달|의료기|장례식장|상담소|어린이집")] df_seoul_hospital[df_seoul_hospital[
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구코드 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1917 | 23210677 | 평화드림여의도성모병원의료기매장 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11560.0 | ... | 서울특별시 영등포구 여의도동 62 | 115603118001 | 서울특별시 영등포구 63로 | 10 | 1156011000100620000031477 | 서울특별시 영등포구 63로 10 | 150713.0 | 7345.0 | 126.936693 | 37.518296 |
2803 | 20895655 | 서울성모병원장례식장꽃배달 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11650.0 | ... | 서울특별시 서초구 반포동 551 | 116504163330 | 서울특별시 서초구 사평대로28길 | 55 | 1165010700105510000017194 | 서울특별시 서초구 사평대로28길 55 | 137040.0 | 6578.0 | 127.000682 | 37.498257 |
4431 | 21781516 | 알콜중독및정신질환상담소 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11320.0 | ... | 서울특별시 도봉구 창동 181-52 | 113204127202 | 서울특별시 도봉구 마들로13길 | 153 | 1132010700101810052014414 | 서울특별시 도봉구 마들로13길 153 | 132040.0 | 1411.0 | 127.046203 | 37.657046 |
4644 | 22020310 | 강남성모병원장례식장꽃배달 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11650.0 | ... | 서울특별시 서초구 반포동 547-6 | 116504163242 | 서울특별시 서초구 반포대로39길 | 56 | 1165010700105470006016762 | 서울특별시 서초구 반포대로39길 56-24 | 137040.0 | 6578.0 | 127.001756 | 37.499095 |
7938 | 20625484 | 원자력병원장례식장 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11350.0 | ... | 서울특별시 노원구 공릉동 215-4 | 113503110002 | 서울특별시 노원구 노원로 | 75 | 1135010300102150004014400 | 서울특별시 노원구 노원로 75 | 139706.0 | 1812.0 | 127.082670 | 37.628808 |
10283 | 20024377 | 삼성의료원장례식장 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11680.0 | ... | 서울특별시 강남구 일원동 50 | 116803122009 | 서울특별시 강남구 일원로 | 81 | 1168011400100500000002609 | 서울특별시 강남구 일원로 81 | 135710.0 | 6351.0 | 127.089579 | 37.490334 |
47008 | 21738670 | 가톨릭대학교성바오로병원장례식장 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11230.0 | ... | 서울특별시 동대문구 전농동 620-56 | 112303105008 | 서울특별시 동대문구 왕산로 | 180 | 1123010400106200056027814 | 서울특별시 동대문구 왕산로 180 | 130709.0 | 2559.0 | 127.043471 | 37.579246 |
60645 | 27670796 | 서울성모병원어린이집 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11650.0 | ... | 서울특별시 서초구 반포동 505 | 116502121003 | 서울특별시 서초구 반포대로 | 222 | 1165010700101230000017226 | 서울특별시 서초구 반포대로 222 | 137701.0 | 6591.0 | 127.005841 | 37.502382 |
70177 | 11537223 | 한림대학교부속한강성심병원장례식장 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11560.0 | ... | 서울특별시 영등포구 영등포동7가 94-200 | 115604154428 | 서울특별시 영등포구 버드나루로7길 | 12 | 1156010800100940200033663 | 서울특별시 영등포구 버드나루로7길 12 | 150030.0 | 7247.0 | 126.909676 | 37.523168 |
9 rows × 29 columns
"상호명"].str.contains("꽃배달|의료기|장례식장|상담소|어린이집")].index df_seoul_hospital[df_seoul_hospital[
Int64Index([1917, 2803, 4431, 4644, 7938, 10283, 47008, 60645, 70177], dtype='int64')
# 종합병원과 무관한 데이터를 전처리를 위해 해당 텍스트 한번에 검색
# 제거할 데이터의 인덱스만 drop_row에 담아주고 list 형태로 변환
= df_seoul_hospital[df_seoul_hospital["상호명"].str.contains("꽃배달|의료기|장례식장|상담소|어린이집")].index
drop_row = drop_row.tolist()
drop_row drop_row
[1917, 2803, 4431, 4644, 7938, 10283, 47008, 60645, 70177]
# 의원으로 끝나는 데이터 인덱스 찾기
# drop_row2 에 담고 list 변환
# str.endswith() : ~로 끝나는거
= df_seoul_hospital[df_seoul_hospital["상호명"].str.endswith("의원")].index
drop_row2 = drop_row2.tolist()
drop_row2 drop_row2
[8479,
12854,
13715,
14966,
16091,
18047,
20200,
20415,
30706,
32889,
34459,
34720,
35696,
37251,
45120,
49626,
51575,
55133,
56320,
56404,
56688,
57551,
62113,
76508]
# 삭제할 행을 drop_row에 합치기
= drop_row + drop_row2
drop_row len(drop_row)
33
# 해당 셀을 삭제하고 삭제 전 후의 행의 갯수 비교
print(df_seoul_hospital.shape)
= df_seoul_hospital.drop(drop_row, axis=0)
df_seoul_hospital print(df_seoul_hospital.shape)
(91, 29)
(58, 29)
# 시군구명에 따라 종합병원의 숫자
"시군구명"].value_counts().plot.bar() df_seoul_hospital[
=(15,4))
plt.figure(figsize=df_seoul_hospital, x="시군구명", order=df_seoul_hospital["시군구명"].value_counts().index) sns.countplot(data
"상호명"].unique() df_seoul_hospital[
array(['대진의료재단', '홍익병원별관', 'SNUH', '한양', '백산의료재단친구병원', '서울보훈병원',
'서울대학교병원', '제일병원', '이랜드클리닉', '사랑나눔의료재단', '우울증센터', '성심의료재단',
'다나의료재단', '서울아산병원신관', '고려대학교구로병원', '학교법인일송학원', '희명스포츠의학센터인공신장실',
'연세대학교의과대학강남세브란스', '국립정신병원', '코아클리닉', '한국전력공사부속한일병원', '신촌연세병원',
'영동세브란스병원', '삼성의료재단강북삼성태', '서울시립보라매병원', '서울대학교병원비상계획외래',
'평화드림서울성모병원의료', '홍익병원', '사랑나눔의료재단서', '우신향병원', '동부제일병원', '아산재단금강병원',
'명곡안연구소', '아산재단서울중앙병원', '메디힐특수여객', '삼성생명공익재단삼성서', '성광의료재단차병원',
'한국건강관리협회서울특', '정해복지부설한신메디피아', '성베드로병원', '성애의료재단', 'Y&T성모마취과',
'영남의료재단', '인제대학교서울백병원', '한국필의료재단', '사랑의병원', '성삼의료재단미즈메디병원',
'씨엠충무병원', '원진재단부설녹색병원', '강남센트럴병원', '우리들병원', '건국대학교병원', '서울적십자병원',
'서울성모병원응급의료센터', '가톨릭대학교여의도성모병원', '씨엠병원'], dtype=object)
특정 지역만 보기
# 서울에 있는 데이터의 위도와 경도 보기
# 결과를 df_seoul 이라는 df에 저장
# 새로운 변수에 데이터프레임 저장시 copy()를 사용
= df[df["시도명"] == "서울특별시"].copy()
df_seoul df_seoul.shape
(18943, 29)
# seaborn 의 countplot를 사용해 위에서 만든 데이터프레ㅣㅁ의 시군구명 시각화
"시군구명"].value_counts().head()
df_seoul["시군구명"].value_counts().plot.bar(figsize=(10,4), rot=30) df_seoul[
=(15,4))
plt.figure(figsize=df_seoul, x="시군구명")
sns.countplot(data# x축 y축 두개 중 하나만 지정해주면 된다.
# pandas의 plot.scatter를 통해 경도와 위도 표시
"경도", "위도", "시군구명"]].plot.scatter()
df_seoul[[# scatter는 x축과 y축이 꼭 들어가야 한다!!
TypeError: scatter() missing 2 required positional arguments: 'x' and 'y'
"경도", "위도", "시군구명"]].plot.scatter(x="경도", y="위도", figsize=(8,7), grid=True) df_seoul[[
=(9,8))
plt.figure(figsize=df_seoul,x="경도", y="위도", hue="시군구명")
sns.scatterplot(data# hue: 색상 다르게
=(9,8))
plt.figure(figsize=df_seoul,x="경도", y="위도", hue="상권업종중분류명") sns.scatterplot(data
=(16,12))
plt.figure(figsize=df,x="경도", y="위도", hue="시도명") sns.scatterplot(data
Folium으로 지도 활용
import folium
# 아나콘다에서 folium 별도 설치해야함
# conda install -c conda-forge folium
# 지도 시각화를 위한 라이브러리
= folium.Map(location=[45.5236, -122.6750]) m
m
Make this Notebook Trusted to load map: File -> Trust Notebook
folium.Map()# 세계 지도 출력!
Make this Notebook Trusted to load map: File -> Trust Notebook
folium.Map()
# 지도의 중심을 지정하기 위해 위도와 경도의 평균을 구한다.
"위도"].mean()
df_seoul_hospital["경도"].mean() df_seoul_hospital[
126.9963589356625
map = folium.Map(location=[df_seoul_hospital["위도"].mean(),df_seoul_hospital["경도"].mean()], zoom_start=12)
1) df_seoul_hospital.head(
상가업소번호 | 상호명 | 상권업종대분류코드 | 상권업종대분류명 | 상권업종중분류코드 | 상권업종중분류명 | 상권업종소분류코드 | 상권업종소분류명 | 시도명 | 시군구코드 | ... | 지번주소 | 도로명코드 | 도로명 | 건물본번지 | 건물관리번호 | 도로명주소 | 구우편번호 | 신우편번호 | 경도 | 위도 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
305 | 25155642 | 대진의료재단 | S | 의료 | S01 | 병원 | S01B01 | 종합병원 | 서울특별시 | 11215.0 | ... | 서울특별시 광진구 중곡동 58-25 | 112153104006 | 서울특별시 광진구 긴고랑로 | 119 | 1121510100100580025000733 | 서울특별시 광진구 긴고랑로 119 | 143220.0 | 4944.0 | 127.088279 | 37.559048 |
1 rows × 29 columns
for n in df_seoul_hospital.index:
= df_seoul_hospital.loc[n, "상호명"]
name = df_seoul_hospital.loc[n, "도로명주소"]
address = f"{name}-{address}"
popup = [df_seoul_hospital.loc[n, "위도"], df_seoul_hospital.loc[n, "경도"]]
location
folium.Marker(= location,
location = popup,
popup map)
).add_to(map
Make this Notebook Trusted to load map: File -> Trust Notebook